package view; import javax.swing.JFrame; import javax.swing.JTextPane; import java.awt.BorderLayout; import javax.swing.JPanel; import java.awt.FlowLayout; import java.awt.Dimension; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import java.awt.print.PrinterJob; import java.awt.print.Paper; import java.awt.print.PageFormat; import java.awt.print.PrinterException; import javax.swing.JButton; import javax.swing.JScrollPane; import java.awt.Font; import javax.swing.text.StyledDocument; import javax.swing.text.BadLocationException; import javax.swing.text.Style; import javax.swing.text.StyleContext; import javax.swing.text.StyleConstants; import java.awt.Color; import java.awt.Toolkit; import java.awt.GraphicsEnvironment; import printing.PrintableJTextPane; public class RGFontMapFrame extends JFrame { public RGFontMapFrame(int defaultFontSize, String defaultSampleText) { new RGFontMapFrame(GraphicsEnvironment .getLocalGraphicsEnvironment() .getAvailableFontFamilyNames(), defaultFontSize, defaultSampleText); } public RGFontMapFrame(String[] fonts, int defaultFontSize, String defaultSampleText) { super("Font-Map"); JTextPane textPane = createTextPane(defaultSampleText, fonts, defaultFontSize); getContentPane().add(BorderLayout.CENTER, createScrollPane(textPane)); JPanel buttons = new JPanel(new FlowLayout(FlowLayout.RIGHT)); buttons.add(createButton(textPane), BorderLayout.EAST); getContentPane().add(BorderLayout.SOUTH, buttons); setPreferredSize(new Dimension(640, 480)); pack(); Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); Dimension e = getSize(); setLocation((d.width - e.width) / 2, ((d.height - e.height) / 2) + 20); setVisible(true); } private ActionListener createPrintAction(final JTextPane textPane) { return new ActionListener() { public void actionPerformed(ActionEvent e) { final int INCH = 72; final double A4_WIDTH = 8.27 * INCH; final double A4_HEIGHT = 5 * INCH; PrinterJob printJob = PrinterJob.getPrinterJob(); Paper paper = new Paper(); int margin = INCH/2; double pageWidth = A4_WIDTH - 2 * margin; double pageHeigth = A4_HEIGHT - 2 * margin; paper.setImageableArea(margin, margin, pageWidth, pageHeigth) ; PageFormat pformat = printJob.defaultPage(); pformat.setPaper(paper); pformat.setOrientation(PageFormat.PORTRAIT); printJob.pageDialog(pformat); printJob.setPrintable(new PrintableJTextPane(textPane)); if (printJob.printDialog()) { try { printJob.print(); } catch (PrinterException pe) { pe.printStackTrace(); } } } }; } private JButton createButton(JTextPane textPane) { JButton b = new JButton("Print \u2026"); b.addActionListener(createPrintAction(textPane)); return b; } private String createPrefix(String s) { StringBuffer b = new StringBuffer(); b.append(s); b.append(": "); return b.toString(); } private JScrollPane createScrollPane(JTextPane t) { JScrollPane s = new JScrollPane(t); s.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); return s; } private String prepareSampleText(String sampleText, String s, int fontSize) { StringBuffer b = new StringBuffer(); for (int i = 0; i < sampleText.length(); i++) { char c = sampleText.charAt(i); b.append(new Font(s, Font.PLAIN, fontSize).canDisplay(c) ? c : ' '); } b.append('\n'); return b.toString(); } private JTextPane createTextPane(String sampleText, String[] fonts, int fontSize) { JTextPane textPane = new JTextPane(); StyledDocument document = textPane.getStyledDocument(); textPane.setEditable(false); stylizeDocument(document, fonts, fontSize); try { for (int i = 0; i < fonts.length; i++) { String s = fonts[i]; document.insertString(document.getLength(), createPrefix(s), document.getStyle("fontstyle")); document.insertString(document.getLength(), prepareSampleText(sampleText, s, fontSize), document.getStyle(s)); } } catch (BadLocationException e) { System.err.println("Couldn't insert initial text into text pane."); } return textPane; } private void stylizeDocument(StyledDocument document, String[] fonts, int fontSize) { Style defaultStyle = StyleContext .getDefaultStyleContext() .getStyle(StyleContext.DEFAULT_STYLE); for (int i = 0; i < fonts.length; i++) { String s = fonts[i]; Style style = document.addStyle(s, defaultStyle); StyleConstants.setFontFamily(style, s); StyleConstants.setFontSize(style, fontSize); } Style style = document.addStyle("fontstyle", defaultStyle); StyleConstants.setFontFamily(style, "Helvetica"); StyleConstants.setFontSize(style, 9); StyleConstants.setForeground(style, Color.gray); } }